package com.chatsystem.service;

import com.chatsystem.dto.LoginRequest;
import com.chatsystem.dto.RegisterRequest;
import com.chatsystem.entity.User;
import com.chatsystem.repository.UserRepository;
import com.chatsystem.util.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 用户服务类
 * 
 * @author ChatSystem
 * @version 1.0.0
 */
@Service
@RequiredArgsConstructor
@Transactional
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    private final JwtUtil jwtUtil;

    /**
     * 用户注册
     * 
     * @param request 注册请求
     * @return 注册结果
     */
    public Map<String, Object> register(RegisterRequest request) {
        // 检查用户名是否已存在
        if (userRepository.existsByUsername(request.getUsername())) {
            throw new RuntimeException("用户名已存在");
        }

        // 检查邮箱是否已存在
        if (request.getEmail() != null && userRepository.existsByEmail(request.getEmail())) {
            throw new RuntimeException("邮箱已存在");
        }

        // 创建新用户
        User user = new User();
        user.setUsername(request.getUsername());
        user.setPassword(passwordEncoder.encode(request.getPassword()));
        user.setEmail(request.getEmail());
        user.setNickname(request.getNickname() != null ? request.getNickname() : request.getUsername());
        user.setStatus(User.UserStatus.ACTIVE);

        User savedUser = userRepository.save(user);

        // 生成JWT令牌
        String token = jwtUtil.generateToken(savedUser.getUsername());

        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("user", savedUser);
        
        return result;
    }

    /**
     * 用户登录
     * 
     * @param request 登录请求
     * @return 登录结果
     */
    public Map<String, Object> login(LoginRequest request) {
        // 查找用户
        Optional<User> userOpt = userRepository.findByUsername(request.getUsername());
        if (userOpt.isEmpty()) {
            throw new RuntimeException("用户名或密码错误");
        }

        User user = userOpt.get();

        // 验证密码
        if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
            throw new RuntimeException("用户名或密码错误");
        }

        // 检查用户状态
        if (user.getStatus() != User.UserStatus.ACTIVE) {
            throw new RuntimeException("用户账户已被禁用");
        }

        // 更新最后登录时间和在线状态
        user.setLastLoginAt(LocalDateTime.now());
        user.setOnlineStatus(User.OnlineStatus.ONLINE);
        userRepository.save(user);

        // 生成JWT令牌
        String token = jwtUtil.generateToken(user.getUsername());

        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("user", user);
        
        return result;
    }

    /**
     * 根据用户名查找用户
     * 
     * @param username 用户名
     * @return 用户对象
     */
    public Optional<User> findByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    /**
     * 根据ID查找用户
     * 
     * @param id 用户ID
     * @return 用户对象
     */
    public Optional<User> findById(Long id) {
        return userRepository.findById(id);
    }

    /**
     * 搜索用户
     * 
     * @param keyword 关键词
     * @return 用户列表
     */
    public List<User> searchUsers(String keyword) {
        return userRepository.findByUsernameOrNicknameContaining(keyword);
    }

    /**
     * 获取所有用户
     * 
     * @return 用户列表
     */
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    /**
     * 获取所有活跃用户
     * 
     * @return 活跃用户列表
     */
    public List<User> getAllActiveUsers() {
        return userRepository.findByStatus(User.UserStatus.ACTIVE);
    }

    /**
     * 更新用户信息
     * 
     * @param user 用户对象
     * @return 更新后的用户
     */
    public User updateUser(User user) {
        return userRepository.save(user);
    }

    /**
     * 更新用户在线状态
     * 
     * @param userId 用户ID
     * @param status 用户状态
     * @return 是否成功更新
     */
    public boolean updateUserStatus(Long userId, User.UserStatus status) {
        return userRepository.findById(userId).map(user -> {
            user.setStatus(status);
            userRepository.save(user);
            return true;
        }).orElse(false);
    }

    /**
     * 更新用户在线状态
     * 
     * @param userId 用户ID
     * @param onlineStatus 在线状态
     * @return 是否成功更新
     */
    public boolean updateUserOnlineStatus(Long userId, User.OnlineStatus onlineStatus) {
        return userRepository.findById(userId).map(user -> {
            user.setOnlineStatus(onlineStatus);
            userRepository.save(user);
            return true;
        }).orElse(false);
    }

    /**
     * 获取当前用户的个人资料
     *
     * @param username 用户名
     * @return 用户对象
     */
    public Optional<User> getCurrentUserProfile(String username) {
        return userRepository.findByUsername(username);
    }

    /**
     * 更新用户的个人资料（昵称和头像URL）
     *
     * @param username 用户名
     * @param newNickname 新昵称
     * @param newAvatarUrl 新头像URL
     * @return 更新后的用户对象
     */
    public User updateUserProfile(String username, String newNickname, String newAvatarUrl) {
        Optional<User> userOpt = userRepository.findByUsername(username);
        if (userOpt.isEmpty()) {
            throw new RuntimeException("用户不存在");
        }
        User user = userOpt.get();
        if (newNickname != null && !newNickname.trim().isEmpty()) {
            user.setNickname(newNickname);
        }
        if (newAvatarUrl != null && !newAvatarUrl.trim().isEmpty()) {
            user.setAvatarUrl(newAvatarUrl);
        }
        return userRepository.save(user);
    }
} 